package com.example.haojiutao.controller.user;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/*
 * @Description: 文件管理
 * @Author: cheng_jianzhen
 * @CreateTime: 2024/1/20 13:19
 * @param: null
 * @return: null
 **/

@Slf4j
@Controller
public class FileController {

    @Value("${fileutils.images.upload.allowed.extensions}")
    private List<String> ALLOWED_EXTENSIONS_IMAGE;

    /**
     * 上传图片的保存目录
     */
    @Value("${fileutils.images.upload.path}")
    private String UPLOAD_PATH_IMAGE;

    /**
     * 图片下载的路径，TODO 此处需要根据不同图片类型拼接不同路径
     */
    private static final String DOWNLOAD_IMAGE_PATH = "/img/";
    private static final String GOODS_IMAGE_PATH = "/img/goodsPic/";

    /**
     * 图片上传
     * @param file
     * @return
     * @throws IOException
     */
    @PostMapping(path = {"/upload/image"})
    @ResponseBody
    public Map<String, Object> uploadImage(@RequestParam("file") MultipartFile file) throws IOException {
        Map<String, Object> result = new HashMap<>();
        if (file.isEmpty()) {//校验上传的文件是否为空
            log.error("uploadFile == 上传的文件为空！");
            result.put("code", "10001");
            result.put("msg", "请求失败， 上传的文件为空");
            return result;
        }
        String fileName = file.getOriginalFilename(); //获取文件名
        /** 获取文件类型（扩展名），并进行校验 */
        String suffixName = fileName.substring(fileName.lastIndexOf(".") + 1);
        if (!isValidExtension(suffixName, ALLOWED_EXTENSIONS_IMAGE)) {
            log.error("文件类{}不符合要求，请重新上传！", suffixName);
            result.put("code", "10001");
            result.put("msg", "请求失败， 文件类不符合要求");
            return result;
        }
        //给文件生成随机文件名
        fileName = getPathName(file);
        //创建上传文件对象：路径 + 文件名
        File desc = new File(UPLOAD_PATH_IMAGE + "\\" + fileName);
        file.transferTo(desc);
        result.put("code", "200");
        //返回图片访问地址，例如： /img/avatorImages/1.jpg， http://localhost:8080/img/avatorImages/1.jpg
        result.put("url", DOWNLOAD_IMAGE_PATH + fileName);
        result.put("msg", "上传成功");
        return result;
    }

    /**
     * 验证上传的文件扩展名是否在允许范围内
     * @param extension 要上传的文件扩展名
     * @param extensions    允许上传的文件扩展名数组
     * @return
     */
    private boolean isValidExtension(String extension, List<String> extensions){
        for(String allowedExtension : extensions){
            if(extension.equalsIgnoreCase(allowedExtension)){
                return true;
            }
        }
        return false;
    }

    /**
     * 生成随机文件名
     * 此处自定义文件名,uuid + extension
     */
    private String getPathName(MultipartFile file) {
        String suffixName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
        return UUID.randomUUID().toString() + "." + suffixName;    //随机生成一个文件名
    }


    public Map<String, Object> uploadAvator(MultipartFile file) throws IOException {
        Map<String, Object> result = new HashMap<>();
        if (file.isEmpty()) {//校验上传的文件是否为空
            log.error("uploadFile == 上传的文件为空！");
            result.put("code", "10001");
            result.put("msg", "请求失败， 上传的文件为空");
            return result;
        }
            String fileName = file.getOriginalFilename(); //获取文件名
            /** 获取文件类型（扩展名），并进行校验 */
            String suffixName = fileName.substring(fileName.lastIndexOf(".") + 1);
            if (!isValidExtension(suffixName, ALLOWED_EXTENSIONS_IMAGE)) {
                log.error("文件类{}不符合要求，请重新上传！", suffixName);
                result.put("code", "10001");
                result.put("msg", "请求失败， 文件类不符合要求");
                return result;
            }
            //给文件生成随机文件名
            fileName = getPathName(file);
            //创建上传文件对象：路径 + 文件名
            File desc = new File(UPLOAD_PATH_IMAGE + "\\" + fileName);
            file.transferTo(desc);
            //result.put("code", "200");
            //返回图片访问地址，例如： /img/avatorImages/1.jpg， http://localhost:8080/img/avatorImages/1.jpg
            result.put("url", DOWNLOAD_IMAGE_PATH + fileName);
            //result.put("msg", "上传成功");
            return result;
        }


}